package generice;

/**
 * 测试泛型
 */
public class Demo1 {
    public static void main(String[] args) {
        //如果不指定泛型，那么泛型则为默认的原型:Object
        TransferObject o = new TransferObject();
        o.setSender("关羽");
        o.setReciver("张飞");
        o.setData("回家吃饭");//setData(T t)  T:Object
        o.setData(123);//自动装箱(Integer.valueOf(123);)

        TransferObject<String> o1 = new TransferObject();
        o1.setData("come back!");
        //o1.setDate(123);//编译不通过

        //泛型不能指定基本类型，因此只能使用对应的包装类
        TransferObject<Integer> o2 = new TransferObject();
        o2.setData(123);//会自动装箱
        //o2.setDate("come back!");//编译不通过 编译器会检查实参类型是否符合泛型要求，不符合编译不通过

        //如果没有指定泛型, 那么接收返回值的变量需要是Object类型的, 否则需要手动造型(可能存在类造型异常)
        Object d = o.getData();//接收泛型返回值时也需要使用原型Object
        String s = (String) o.getData();

        //o1实例化时指定的泛型为String类型, 因此获取时无需造型
        String s1 = o1.getData();//获取时public T getData()  T:String
        Integer i1 = o2.getData();//编译器会自动补充造型操作
    }
}
